﻿using System;
using MoroMoro.Samples.ToDoList.Base.Application;

namespace MoroMoro.Samples.ToDoList.Application.ToDos
{
    /// <summary>
    /// ToDo の状態を戻す際のエラーを表します。
    /// </summary>
    /// <seealso cref="IToDoReversionErrorsHandler"/>
    [Serializable]
    public class ToDoReversionErrors : CommitmentErrors
    {
        /// <summary>
        /// 指定した状態に戻すことができない ToDo が含まれています。
        /// </summary>
        public bool ContainsToDoWhichCanNotRevert
        {
            private get;
            set;
        }

        /// <summary>
        /// 指定したハンドラにエラー処理を委譲します。
        /// </summary>
        /// <param name="handler">エラーを処理するハンドラ。</param>
        /// <exception cref="System.ArgumentNullException">handler が null です。</exception>
        public void HandledBy(IToDoReversionErrorsHandler handler)
        {
            if (handler == null)
            {
                throw new ArgumentNullException("handler");
            }

            base.HandledBy(handler);
            if (ContainsToDoWhichCanNotRevert)
            {
                handler.HandleContainsToDoWhichCanNotRevert();
            }
        }
    }

    /// <summary>
    /// <see cref="ToDoReversionErrors"/> を処理する方法を定義します。
    /// </summary>
    /// <seealso cref="ToDoReversionErrors"/>
    public interface IToDoReversionErrorsHandler : ICommitmentErrorsHandler
    {
        /// <summary>
        /// ContainsToDoWhichCanNotRevert を処理します。
        /// </summary>
        void HandleContainsToDoWhichCanNotRevert();

    }
}
